<?php

class User_Another extends User_Abstract
{
    public function __construct($user_id)
    {
        parent::__construct($user_id);
        self::$_dbh = Framework_Registry::get('dbh');
    }
    
    /**
     * Возвращает объект User_Another если такой логин существует, и null в
     * противном случае
     * 
     * @param string $username
     * @return int
     */
    public static function findUserIdByLogin($username)
    {
        $user_id = parent::findUserIdByLogin($username);
        
        return empty($user_id) ? null : new self($user_id);
    }
    
    /**
     * Возвращает объект User_Another если такой user_id существует, и null в
     * противном случае
     * 
     * @param string $username
     * @return int
     */
    public static function findLoginByUserId($user_id)
    {
        $user_id = parent::findLoginByUserId($user_id);

        return empty($user_id) ? null : new self($user_id);
    }
	
	
	/**
	 * @param str $order 
	 * @param int $desc 
	 * @return array
	 * @author kiote
	 */
	public static function getUserList($order = '', $desc = 0,$page = 0, $sum = 0, &$paging = array())
	{
		$row = 'user_id';
		$desc = ($desc) ? 'DESC' : '';
		if (''!==$order) 
		{
			if (in_array($order,array('active','block','last_visit','login',
										'sex','born','country','city','description',
										'avatar','updated','created','onhome')))
			{
				if ('onhome'==$order) $order = 'show_on_home';
				$row ='user_'.$order;
			}
			elseif ('abused'==$order) $row = 'abuse_count';
		}
		$rows = Framework_Registry::get('dbh')
			->selectPage($total_rows,
						"SELECT *, count(abuse_id) as abuse_count 
						FROM user 
						LEFT JOIN abuse ON (abuse_user_id_to = user_id) 
						WHERE user_password IS NOT NULL
						GROUP BY user_id
						ORDER BY $row $desc
						{ LIMIT ?d,?d } ",   
						$sum*$page,
						(!$sum) ? DBSIMPLE_SKIP : $sum
					);
		$paging = paging($page, $sum, $total_rows);
		return $rows;
	}

    public static function getTopUsers($sum = 10)
    {
        return Framework_Registry::get('dbh')
            ->select('SELECT user_id,
                          user_login,
                          UNIX_TIMESTAMP(user_last_visit) AS user_last
                      FROM user
                      WHERE user_password IS NOT NULL
                      ORDER BY user_rating DESC
                      LIMIT ?d', $sum);
    }
    
    public static function search($search, $page = 0, $sum = 10, &$paging = array())
    {
        $result = !is_array($search) ? null : 
            Framework_Registry::get('dbh')
                ->selectPage($total_rows,
                    "SELECT *, (YEAR(CURRENT_DATE)-YEAR(user_born))
                        - (RIGHT(CURRENT_DATE,5)<RIGHT(user_born,5)) AS user_age
                     FROM `user`
                     WHERE { user_login = ? AND }
                           { user_sex = ? AND }
                           { 1 = ? AND UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(user_last_visit) < 300 AND }
                           { (YEAR(CURRENT_DATE)-YEAR(user_born))
                               - (RIGHT(CURRENT_DATE,5)<RIGHT(user_born,5)) = ? AND }
                           user_password IS NOT NULL
                     ORDER BY user_id
                     LIMIT ?d, ?d",
                     (empty($search['login']) ? DBSIMPLE_SKIP : $search['login']),
                     (empty($search['sex']) ? DBSIMPLE_SKIP : $search['sex']),
                     (empty($search['con']) ? DBSIMPLE_SKIP : $search['con']),
                     (empty($search['age']) ? DBSIMPLE_SKIP : $search['age']),
                     $page*$sum, $sum);
        $paging = paging($page, $sum, $total_rows);
        
        return $result;
    }
    
	/**
	 * получаем все жалобы на юзера из таблички abuses
	 * @return array
	 * @author kiote
	 */
	public function getAllAbuse()
	{
		return Framework_Registry::get('dbh')->
			select("SELECT * FROM abuse
					JOIN `user` ON (abuse_user_id_from = user_id)
					WHERE abuse_user_id_to = ?",$this->_userId);
	}

     /**
     * Блокируем пользователя по user_id
     * по умолчанию, юзер блокируется на 3 дня
     * TODO: вынести период блокировки в настройки 
     * @param int $user_id
     * @author kiote
     */
    public function setUserBlock($user_id)
    {
        self::$_dbh->query("UPDATE `user` 
                                SET user_block = CURRENT_TIMESTAMP + interval 3 day
                            WHERE user_id = ?",$user_id);
    }
    
    /**
     * разблокируем пользователя по user_id
     * @param int $user_id
     * @author kiote
     */
    public function setUserUnBlock($user_id)
    {
        self::$_dbh->query("UPDATE `user` 
                                SET user_block = NULL
                            WHERE user_id = ?",$user_id);
    }
    
    public function setVisitor($user_id)
    {
        if (!preg_match('[^\d+$]', $user_id)) {
            return 0;
        }
        
        $row = self::$_dbh->query('UPDATE visitor
                                   SET visitor_count=visitor_count+1
                                   WHERE visitor_user_id_from=? AND visitor_user_id_to=?',
                                   $user_id, $this->_userId);
        if (!$row) {
            $row = self::$_dbh->query('INSERT INTO visitor
                                       SET visitor_user_id_from=?, visitor_user_id_to=?, visitor_created=NOW()',
                                       $user_id, $this->_userId);
        }
        
        return $row;
    }
    
    /**
     * Люди за которых голосуют на главной
     *
     * TODO Не работает(((, что делать???
     * @return unknown
     */
    public static function getHomeUser($user_id = null)
    {
        $ids = Framework_Registry::get('dbh')
            ->selectCol("SELECT user_id, rating.* FROM user
                         LEFT JOIN rating ON rating_user_id_to = user_id
                         WHERE { user_id!=? AND} user_avatar IS NOT NULL
                            { AND (rating_user_id_to IS NULL OR rating_user_id_to NOT IN " .
                            		"(SELECT rating_user_id_to " .
                            		"FROM rating WHERE rating_user_id_from = ?)) }",
                         empty($user_id) ? DBSIMPLE_SKIP : $user_id,
                         empty($user_id) ? DBSIMPLE_SKIP : $user_id,
                         empty($user_id) ? DBSIMPLE_SKIP : $user_id);
        return !sizeof($ids) ? null : Framework_Registry::get('dbh')
            ->selectRow("SELECT user_id, user_login, user_avatar, user_path
                         FROM user
                         WHERE user_id=?", $ids[array_rand($ids, 1)]);
    }
    
    /**
     * тот же функционал, версия kiote
     */
    public static function getHomeUser_other($user_id = null)
    {
    	
    }
    
    /**
     * получаем пользователя для глагне, за кторого только что проголосовали
     */
    public static function getHomeUserId($user_id)
    {
    	 return Framework_Registry::get('dbh')
            ->selectRow("SELECT user_id, user_login, user_avatar, user_path
                         FROM user
                         WHERE user_id=?", $user_id);           
    }

    public function setInvite($user_id, $room_id)
    {
        return empty($room_id) ? null : @self::$_dbh
            ->query("INSERT INTO invite
                     SET invite_room_id=?, invite_user_id_from=?, invite_user_id_to=?",
                     $room_id, $user_id, $this->_userId);
    }
    
    /**
     * получаем другого пользователя для листалки профайлов
     * @param int $current_user_id id текушего пользователя (чей профайл смотрим)
     * @param int $user_id id залогиненного пользователя(его тоже не надо выбирать)
     * @author kiote
     * 
     */
    public function getNewUser($current_user_id, $user_id)
 	{
 		 $row = @self::$_dbh
            ->selectRow("SELECT user_id " .
            			"FROM user " .
            			"WHERE user_password IS NOT NULL " .
            			"AND user_id NOT IN (?,?) " .
            			"ORDER BY RAND()", $current_user_id, $user_id);
         return ($row) ? $row['user_id'] : $current_user_id;
 	}   
}